home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Other / mCD / Source / scsi_cd.subproj / scsireg_31.h < prev   
Encoding:
C/C++ Source or Header  |  1993-09-03  |  21.2 KB  |  774 lines

  1. /*    @(#)scsireg.h    1.0    10/23/89    (c) 1989 NeXT    */
  2. /*
  3.  * scsireg.h -- generic SCSI definitions
  4.  * KERNEL VERSION
  5.  *
  6.  * HISTORY
  7.  * 10-Feb-93       dmitch
  8.  *    Added generic endian/alignment #ifdef's.
  9.  * 17-May-90    dmitch
  10.  *    Added SDIOCGETCAP
  11.  * 30-Apr-90    dmitch
  12.  *    Added C6S_SS_START, C6S_SS_STOP, C6S_SS_EJECT, SR_IOST_VOLNA
  13.  * 30-Oct-89    dmitch
  14.  *    Deleted private #defines (--> scsivar.h)
  15.  * 25-Sep-89    dmitch at NeXT
  16.  *    Added scsi_req, support for sg and st drivers
  17.  * 10-Sept-87      Mike DeMoney (mike) at NeXT
  18.  *    Created.
  19.  */
  20.  
  21.  /* Garance/mCD:  Copied this to the mCD directory, as I'm developing
  22.     mCD on a NS3.0 system but want to use the NS3.1 version of scsireg */
  23.  
  24. #ifndef _BSD_DEV_SCSIREG_
  25. #define    _BSD_DEV_SCSIREG_
  26.  
  27. #import <sys/ioctl.h>
  28. #import <sys/time.h>
  29. #import <kernserv/queue.h>
  30. #import <sys/types.h>
  31.  
  32. /*
  33.  * status byte definitions
  34.  */
  35. #define    STAT_GOOD        0x00    /* cmd successfully completed */
  36. #define    STAT_CHECK        0x02    /* abnormal condition occurred */
  37. #define    STAT_CONDMET        0x04    /* condition met / good */
  38. #define    STAT_BUSY        0x08    /* target busy */
  39. #define    STAT_INTMGOOD        0x10    /* intermediate / good */
  40. #define    STAT_INTMCONDMET    0x14    /* intermediate / cond met / good */
  41. #define    STAT_RESERVED        0x18    /* reservation conflict */
  42.  
  43. #define    STAT_MASK        0x1e    /* clears vendor unique bits */
  44.  
  45.  
  46. /*
  47.  * SCSI command descriptor blocks
  48.  * (Any device level driver doing fancy things will probably define
  49.  * these locally and cast a pointer on top of the sd_cdb.  We define
  50.  * them here to reserve the appropriate space, driver level routines
  51.  * can use them if they want.)
  52.  *
  53.  * 6 byte command descriptor block, random device
  54.  */
  55. typedef struct cdb_6 {
  56. #if    __BIG_ENDIAN__
  57.     u_int    c6_opcode:8,        /* device command */
  58.         c6_lun:3,        /* logical unit */
  59.         c6_lba:21;        /* logical block number */
  60.     u_char    c6_len;            /* transfer length */
  61.     u_char    c6_ctrl;        /* control byte */
  62.  
  63. #elif    __LITTLE_ENDIAN__
  64.     u_char    c6_opcode;
  65.     u_char    c6_lba2        :5,
  66.         c6_lun        :3;
  67.     u_char    c6_lba1;
  68.     u_char    c6_lba0;
  69.     u_char    c6_len;
  70.     u_char    c6_ctrl;
  71.  
  72. #else
  73. #error    SCSI command / data structures are compiler sensitive
  74. #endif
  75. } cdb_6_t;
  76.  
  77. #define CDB_6_MAX_LENGTH        (255)           /* max block count */
  78. #define CDB_6_MAX_LBA           ((1 << 21) - 1) /* max block address */
  79.  
  80. /*
  81.  * 6 byte command descriptor block, sequential device
  82.  */
  83. typedef struct cdb_6s {
  84. #if    __BIG_ENDIAN__
  85.     u_char    c6s_opcode:8;        /* device command */
  86.     u_char  c6s_lun:3,        /* logical unit */
  87.         c6s_spare:3,        /* reserved */
  88.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  89.                      *    etc. */ 
  90.     u_int    c6s_len:24,        /* transfer length */
  91.         c6s_ctrl:8;        /* control byte */
  92.  
  93. #elif    __LITTLE_ENDIAN__
  94.     u_char    c6s_opcode;
  95.     u_char    c6s_opt        :2,
  96.         c6s_spare    :3,
  97.         c6s_lun        :3;
  98.     u_char    c6s_len2;
  99.     u_char    c6s_len1;
  100.     u_char    c6s_len0;
  101.     u_char    c6s_ctrl;
  102.  
  103. #else    
  104. #error    SCSI command / data structures are compiler sensitive
  105. #endif
  106. } cdb_6s_t;
  107.  
  108.  
  109. /*
  110.  * 10 byte command descriptor block
  111.  * This definition is machine dependent due to an int on a short boundary.
  112.  */
  113. typedef struct cdb_10 {
  114. #if    __BIG_ENDIAN__
  115. #if    __NATURAL_ALIGNMENT__
  116.         u_char  c10_opcode;             /* device command */
  117.         u_char  c10_lun:3,              /* logical unit */
  118.                 c10_dp0:1,              /* disable page out */
  119.                 c10_fua:1,              /* force unit access */
  120.                 c10_mbz1:2,             /* reserved: must be zero */
  121.                 c10_reladr:1;           /* addr relative to prev 
  122.                             * linked cmd */
  123.     /*
  124.      * Careful, this can't be an int due to natural alignment...
  125.      */
  126.         u_char    c10_lba[4];             /* logical block number */
  127.         u_char    c10_mbz2:8;          /* reserved: must be zero */
  128.     u_char     c10_len[2];         /* transfer length */
  129.     u_char    c10_ctrl;        /* control byte */
  130.  
  131. #else    __NATURAL_ALIGNMENT__
  132.  
  133.     u_char    c10_opcode;        /* device command */
  134.     u_char    c10_lun:3,        /* logical unit */
  135.         c10_dp0:1,        /* disable page out (cache control) */
  136.         c10_fua:1,        /* force unit access (cache control) */
  137.         c10_mbz1:2,        /* reserved: must be zero */
  138.         c10_reladr:1;        /* addr relative to prev linked cmd */
  139.     u_int    c10_lba;        /* logical block number */
  140.     u_int    c10_mbz2:8,        /* reserved: must be zero */
  141.         c10_len:16,        /* transfer length */
  142.         c10_ctrl:8;        /* control byte */
  143.         
  144. #endif    __NATURAL_ALIGNMENT__
  145. #elif    __LITTLE_ENDIAN__
  146.  
  147.     u_char    c10_opcode;
  148.     u_char    c10_reladr    :1,
  149.         c10_mbz1    :2,
  150.         c10_fua        :1,
  151.         c10_dp0        :1,
  152.         c10_lun        :3;
  153.     u_char    c10_lba3;
  154.     u_char    c10_lba2;
  155.     u_char    c10_lba1;
  156.     u_char    c10_lba0;
  157.     u_char    c10_mbz2;
  158.     u_char    c10_len1;
  159.     u_char    c10_len0;
  160.     u_char    c10_ctrl;
  161.  
  162. #else
  163. #error    SCSI command / data structures are compiler sensitive
  164. #endif
  165. } cdb_10_t;
  166.  
  167. /*
  168.  * 12 byte command descriptor block
  169.  * This definition is machine dependent due to an int on a short boundary.
  170.  */
  171. typedef struct cdb_12 {
  172. #if    __BIG_ENDIAN__
  173. #if    __NATURAL_ALIGNMENT__
  174.  
  175.         u_char    c12_opcode;        /* device command */
  176.         u_char    c12_lun:3,        /* logical unit */
  177.         c12_dp0:1,              /* disable page out */
  178.         c12_fua:1,              /* force unit access */
  179.         c12_mbz1:2,             /* reserved: must be zero */
  180.         c12_reladr:1;           /* addr relative to prev 
  181.                      * linked cmd */
  182.         u_char    c12_lba[4];             /* logical block number */
  183.         u_char    c12_mbz2;         /* reserved: must be zero */
  184.         u_char    c12_mbz3;        /* reserved: must be zero */
  185.         u_char    c12_mbz4;         /* reserved: must be zero */
  186.         u_char    c12_len[2];        /* transfer length */
  187.         u_char    c12_ctrl:8;             /* control byte */
  188.  
  189. #else    __NATURAL_ALIGNMENT__
  190.  
  191.     u_char    c12_opcode;        /* device command */
  192.     u_char    c12_lun:3,        /* logical unit */
  193.         c12_dp0:1,        /* disable page out (cache control) */
  194.         c12_fua:1,        /* force unit access (cache control) */
  195.         c12_mbz1:2,        /* reserved: must be zero */
  196.         c12_reladr:1;        /* addr relative to prev linked cmd */
  197.     u_int    c12_lba;        /* logical block number */
  198.     u_char    c12_mbz2;        /* reserved: must be zero */
  199.     u_char    c12_mbz3;        /* reserved: must be zero */
  200.     u_int    c12_mbz4:8,        /* reserved: must be zero */
  201.         c12_len:16,        /* transfer length */
  202.         c12_ctrl:8;        /* control byte */
  203.  
  204. #endif    __NATURAL_ALIGNMENT__
  205. #elif    __LITTLE_ENDIAN__
  206.  
  207.     u_char    c12_opcode;
  208.     u_char    c12_reladr    :1,
  209.         c12_mbz1    :2,
  210.         c12_fua        :1,
  211.         c12_dp0        :1,
  212.         c12_lun        :3;
  213.     u_char    c12_lba3;
  214.     u_char    c12_lba2;
  215.     u_char    c12_lba1;
  216.     u_char    c12_lba0;
  217.     u_char    c12_mbz2;
  218.     u_char    c12_mbz3;
  219.     u_char    c12_mbz4;
  220.     u_char    c12_len1;
  221.     u_char    c12_len0;
  222.     u_char    c12_ctrl;
  223.  
  224. #else
  225. #error    SCSI command / data structures are compiler sensitive
  226. #endif
  227. } cdb_12_t;
  228.  
  229. typedef union cdb {
  230.     struct    cdb_6    cdb_c6;
  231.     struct  cdb_6s  cdb_c6s;
  232.     struct    cdb_10    cdb_c10;
  233.     struct    cdb_12    cdb_c12;
  234. } cdb_t;
  235.  
  236. #define    cdb_opcode    cdb_c6.c6_opcode    /* all opcodes in same place */
  237.  
  238. /*
  239.  * control byte values
  240.  */
  241. #define    CTRL_LINKFLAG        0x03    /* link and flag bits */
  242. #define    CTRL_LINK        0x01    /* link only */
  243. #define    CTRL_NOLINK        0x00    /* no command linking */
  244.  
  245. /*
  246.  * six byte cdb opcodes
  247.  * (Optional commands should only be used by formatters)
  248.  */
  249. #define    C6OP_TESTRDY        0x00    /* test unit ready */
  250. #define C6OP_REWIND        0x01    /* rewind */
  251. #define    C6OP_REQSENSE        0x03    /* request sense */
  252. #define    C6OP_FORMAT        0x04    /* format unit */
  253. #define    C6OP_REASSIGNBLK    0x07    /* OPT: reassign block */
  254. #define    C6OP_READ        0x08    /* read data */
  255. #define    C6OP_WRITE        0x0a    /* write data */
  256. #define    C6OP_SEEK        0x0b    /* seek */
  257. #define C6OP_READREV        0x0F    /* read reverse */
  258. #define C6OP_WRTFM        0x10    /* write filemarks */
  259. #define C6OP_SPACE        0x11    /* space records/filemarks */
  260. #define    C6OP_INQUIRY        0x12    /* get device specific info */
  261. #define C6OP_VERIFY        0x13    /* sequential verify */
  262. #define    C6OP_MODESELECT        0x15    /* OPT: set device parameters */
  263. #define    C6OP_MODESENSE        0x1a    /* OPT: get device parameters */
  264. #define    C6OP_STARTSTOP        0x1b    /* OPT: start or stop device */
  265. #define    C6OP_SENDDIAG        0x1d    /* send diagnostic */
  266.  
  267. /*
  268.  * ten byte cdb opcodes
  269.  */
  270. #define    C10OP_READCAPACITY    0x25    /* read capacity */
  271. #define    C10OP_READEXTENDED    0x28    /* read extended */
  272. #define    C10OP_WRITEEXTENDED    0x2a    /* write extended */
  273. #define    C10OP_READDEFECTDATA    0x37    /* OPT: read media defect info */
  274.  
  275.  
  276. /*
  277.  *    c6s_opt - options for 6-byte sequential device commands 
  278.  */
  279.  
  280. #define C6OPT_FIXED        0x01    /* fixed block transfer */
  281. #define C6OPT_LONG        0x01    /* 1 = erase to EOT */
  282. #define C6OPT_IMMED        0x01    /* immediate (for rewind, retension) */
  283. #define C6OPT_BYTECMP        0x02    /* byte compare for C6OP_VERIFY */
  284. #define C6OPT_SIL        0x02    /* suppress illegal length (Exabyte) */
  285. #define C6OPT_SPACE_LB        0x00    /* space logical blocks */
  286. #define C6OPT_SPACE_FM        0x01    /* space filemarks */
  287. #define C6OPT_SPACE_SFM        0x02    /* space sequential filemarks */
  288. #define C6OPT_SPACE_PEOD    0x03    /* space to physical end of data */    
  289.  
  290. /*    
  291.  *    other 6-byte sequential command constants
  292.  */
  293.  
  294. #define C6S_MAXLEN        0xFFFFFF    
  295. #define C6S_RETEN        0x02    /* byte 4 of load/unload - retension */
  296. #define C6S_LOAD        0x01    /* byte 4 of load/unload - load */
  297.  
  298. /*
  299.  * these go in the c6_len fields of start/stop command
  300.  */
  301. #define C6S_SS_START        0x01    /* start unit */
  302. #define C6S_SS_STOP        0x00    /* stop unit */
  303. #define C6S_SS_EJECT        0x02    /* eject disk */
  304.  
  305. /*
  306.  * extended sense data
  307.  * returned by C6OP_REQSENSE
  308.  */
  309. typedef struct esense_reply {
  310. #if    __BIG_ENDIAN__
  311.  
  312.     u_char    er_ibvalid:1,        /* information bytes valid */
  313.         er_class:3,        /* error class */
  314.         er_code:4;        /* error code */
  315.     u_char    er_segment;        /* segment number for copy cmd */
  316.     u_char    er_filemark:1,        /* file mark */
  317.         er_endofmedium:1,    /* end-of-medium */
  318.         er_badlen:1,        /* incorrect length */
  319.         er_rsvd2:1,        /* reserved */
  320.         er_sensekey:4;        /* sense key */
  321.     u_char    er_infomsb;        /* MSB of information byte */
  322.     u_int    er_info:24,        /* bits 23 - 0 of info "byte" */
  323.         er_addsenselen:8;    /* additional sense length */
  324.     u_int    er_rsvd8;        /* copy status (unused) */
  325.     u_char    er_addsensecode;    /* additional sense code */
  326.     
  327.     /* the following are used for tape only as of 27-Feb-89 */
  328.     
  329.     u_char    er_qualifier;        /* sense code qualifier */
  330.     u_char  er_rsvd_e;
  331.     u_char  er_rsvd_f;
  332.     u_int   er_err_count:24,    /* three bytes of data error counter */
  333.         er_stat_13:8;        /* byte 0x13 - discrete status bits */
  334.     u_char  er_stat_14;        /* byte 0x14 - discrete status bits */
  335.     u_char  er_stat_15;        /* byte 0x15 - discrete status bits */
  336.     
  337. #if    __NATURAL_ALIGNMENT__
  338.  
  339.     u_char    er_rsvd_16;
  340.     u_char    er_remaining[3];    /* bytes 0x17..0x19 - remaining tape */
  341.  
  342. #else    __NATURAL_ALIGNMENT__
  343.  
  344.     u_int   er_rsvd_16:8,
  345.         er_remaining:24;    /* bytes 0x17..0x19 - remaining tape */
  346.  
  347. #endif    __NATURAL_ALIGNMENT__
  348.  
  349. #elif    __LITTLE_ENDIAN__
  350.  
  351.     u_char    er_code        :4,
  352.         er_class    :3,
  353.         er_ibvalid    :1;
  354.     u_char    er_segment;
  355.     u_char    er_sensekey    :4,
  356.         er_rsvd2    :1,
  357.         er_badlen    :1,
  358.         er_endofmedium    :1,
  359.         er_filemark    :1;
  360.     u_char    er_info3;
  361.     u_char    er_info2;
  362.     u_char    er_info1;
  363.     u_char    er_info0;
  364.     u_char    er_addsenselen;
  365.     u_char    er_rsvd8[4];
  366.     u_char    er_addsensecode;
  367.  
  368.     u_char    er_qualifier;
  369.     u_char    er_rsvd_e;
  370.     u_char    er_rsvd_f;
  371.     u_char    er_err_count2;
  372.     u_char    er_err_count1;
  373.     u_char    er_err_count0;
  374.     u_char    er_stat_13;
  375.     u_char    er_stat_14;
  376.     u_char    er_stat_15;
  377.     u_char    er_rsvd_16;
  378.     u_char    er_remaining2;
  379.     u_char    er_remaining1;
  380.     u_char    er_remaining0;
  381.  
  382. #else
  383. #error    SCSI command / data structures are compiler sensitive
  384. #endif
  385.         
  386.     /* technically, there can be additional bytes of sense info
  387.      * here, but we don't check them, so we don't define them
  388.      */
  389. } esense_reply_t;
  390.  
  391. /*
  392.  * sense keys
  393.  */
  394. #define    SENSE_NOSENSE        0x0    /* no error to report */
  395. #define    SENSE_RECOVERED        0x1    /* recovered error */
  396. #define    SENSE_NOTREADY        0x2    /* target not ready */
  397. #define    SENSE_MEDIA        0x3    /* media flaw */
  398. #define    SENSE_HARDWARE        0x4    /* hardware failure */
  399. #define    SENSE_ILLEGALREQUEST    0x5    /* illegal request */
  400. #define    SENSE_UNITATTENTION    0x6    /* drive attention */
  401. #define    SENSE_DATAPROTECT    0x7    /* drive access protected */
  402. #define    SENSE_ABORTEDCOMMAND    0xb    /* target aborted command */
  403. #define    SENSE_VOLUMEOVERFLOW    0xd    /* eom, some data not transfered */
  404. #define    SENSE_MISCOMPARE    0xe    /* source/media data mismatch */
  405.  
  406. /*
  407.  * inquiry data
  408.  */
  409. typedef struct inquiry_reply {
  410.  
  411. #if    __BIG_ENDIAN__
  412.  
  413.     u_char    ir_qual:3,        /* qualifier */
  414.         ir_devicetype:5;    /* device type, see below */
  415.     u_char    ir_removable:1,        /* removable media */
  416.         ir_typequalifier:7;    /* device type qualifier */
  417.     u_char    ir_isoversion:2,    /* ISO  version number */
  418.         ir_ecmaversion:3,    /* ECMA version number */
  419.         ir_ansiversion:3;    /* ANSI version number */
  420.     u_char    ir_zero2:4,        /* reserved */
  421.         ir_rspdatafmt:4;    /* response data format */
  422.     u_char    ir_addlistlen;        /* additional list length */
  423.     u_char    ir_zero3[2];        /* reserved */
  424.     u_char    ir_reladr:1,        /* relative addressing */
  425.         ir_wbus32:1,        /* 32-bit wide data transfers */
  426.         ir_wbus16:1,        /* 16-bit wide data transfers */
  427.         ir_sync:1,        /* synchronous data transfers */
  428.         ir_linked:1,        /* linked commands */
  429.         ir_zero4:1,        /* reserved */
  430.         ir_cmdque:1,        /* tagged command queuing */
  431.         ir_sftre:1;        /* soft reset */
  432.     char    ir_vendorid[8];        /* vendor name in ascii */
  433.     char    ir_productid[16];    /* product name in ascii */
  434.     char    ir_revision[4];        /* revision level info in ascii */
  435.     char    ir_misc[28];        /* misc info */
  436.     char    ir_endofid[1];        /* just a handle for end of id info */
  437.  
  438. #elif    __LITTLE_ENDIAN__
  439.  
  440.     u_char    ir_devicetype    :5,
  441.         ir_qual        :3;
  442.     u_char    ir_typequalifier:7,
  443.         ir_removable    :1;
  444.     u_char    ir_ansiversion    :3,
  445.         ir_ecmaversion    :3,
  446.         ir_isoversion    :2;
  447.     u_char    ir_rspdatafmt    :4,
  448.         ir_zero2    :4;
  449.     u_char    ir_addlistlen;
  450.     u_char    ir_zero3[2];
  451.     u_char    ir_sftre    :1,
  452.         ir_cmdque    :1,
  453.         ir_zero4    :1,
  454.         ir_linked    :1,
  455.         ir_sync        :1,
  456.         ir_wbus16    :1,
  457.         ir_wbus32    :1,
  458.         ir_reladr    :1;
  459.     u_char    ir_vendorid[8];
  460.     u_char    ir_productid[16];
  461.     u_char    ir_revision[4];
  462.     u_char    ir_misc[28];
  463.     u_char    ir_endofid[1];
  464.  
  465. #else
  466. #error    SCSI command / data structures are compiler sensitive
  467. #endif
  468. } inquiry_reply_t;
  469.  
  470. #define    DEVQUAL_OK        0x00    /* device is connected to this lun */
  471. #define    DEVQUAL_MIA        0x01    /* device not connected to lun */
  472. #define    DEVQUAL_RSVD        0x02    /* reserved */
  473. #define    DEVQUAL_NODEV        0x03    /* target doesn't support dev on lun */
  474. #define    DEVQUAL_VUMASK        0x04    /* 1XXb is vendor specific */
  475.  
  476.  
  477. #define    DEVTYPE_DISK        0x00    /* read/write disks */
  478. #define    DEVTYPE_TAPE        0x01    /* tapes and other sequential devices*/
  479. #define    DEVTYPE_PRINTER        0x02    /* printers */
  480. #define    DEVTYPE_PROCESSOR    0x03    /* cpu's */
  481. #define    DEVTYPE_WORM        0x04    /* write-once optical disks */
  482. #define    DEVTYPE_CDROM        0x05    /* cd rom's, etc */
  483. #define DEVTYPE_SCANNER        0x06
  484. #define DEVTYPE_OPTICAL        0x07    /* other optical storage */
  485. #define DEVTYPE_CHANGER        0x08    /* jukebox */
  486. #define DEVTYPE_COMM        0x09    /* communication device */
  487. #define DEVTYPE_GRAPH_A        0x0a    /* ASC IT8 graphics */
  488. #define DEVTYPE_GRAPH_B        0x0b    /* ASC IT8 graphics */
  489. #define DEVTYPE_NOTPRESENT      0x1f    /* logical unit not present */
  490.  
  491. /*
  492.  * read capacity reply
  493.  */
  494. typedef struct capacity_reply {
  495.  
  496. #if    __BIG_ENDIAN__
  497.  
  498.     u_int    cr_lastlba;        /* last logical block address */
  499.     u_int    cr_blklen;        /* block length */
  500.  
  501. #elif    __LITTLE_ENDIAN__
  502.  
  503.     u_char    cr_lastlba3;
  504.     u_char    cr_lastlba2;
  505.     u_char    cr_lastlba1;
  506.     u_char    cr_lastlba0;
  507.  
  508.     u_char    cr_blklen3;
  509.     u_char    cr_blklen2;
  510.     u_char    cr_blklen1;
  511.     u_char    cr_blklen0;
  512.  
  513. #else
  514. #error    SCSI command / data structures are compiler sensitive
  515. #endif
  516. } capacity_reply_t;
  517.  
  518. /*
  519.  * Standard Mode Select/Mode Sense data structures
  520.  */
  521.  
  522. typedef struct mode_sel_hdr {
  523.  
  524. #if    __BIG_ENDIAN__
  525.  
  526.     u_char         msh_sd_length_0;    /* byte 0 - length (mode sense
  527.                          *    only)  */
  528.     u_char        msh_med_type;        /* medium type - random access
  529.                          *   devices only */
  530.     u_char        msh_wp:1,        /* byte 2 bit 7 - write protect
  531.                          *   mode sense only) */
  532.             msh_bufmode:3,        /* buffered mode - sequential
  533.                          *   access devices only */
  534.             msh_speed:4;        /* speed - sequential access
  535.                          *   devices only */
  536.     u_char        msh_bd_length;        /* block descriptor length */
  537.  
  538. #elif    __LITTLE_ENDIAN__
  539.  
  540.     u_char        msh_sd_length_0;
  541.     u_char        msh_med_type;
  542.     u_char        msh_speed    :4,
  543.             msh_bufmode    :3,
  544.             msh_wp        :1;
  545.     u_char        msh_bd_length;
  546.  
  547. #else
  548. #error    SCSI command / data structures are compiler sensitive
  549. #endif
  550. } mode_sel_hdr_t;
  551.  
  552. typedef struct mode_sel_bd {                /* block descriptor */
  553.  
  554. #if    __BIG_ENDIAN__
  555.  
  556.     u_int        msbd_density:8,
  557.             msbd_numblocks:24;
  558.     u_int        msbd_rsvd_0:8,        /* byte 4 - reserved */
  559.             msbd_blocklength:24;
  560.  
  561. #elif    __LITTLE_ENDIAN__
  562.  
  563.     u_char        msbd_density;
  564.     u_char        msbd_numblocks2;
  565.     u_char        msbd_numblocks1;
  566.     u_char        msbd_numblocks0;
  567.     u_char        msbd_rsvd_0;
  568.     u_char        msbd_blocklength2;
  569.     u_char        msbd_blocklength1;
  570.     u_char        msbd_blocklength0;
  571.  
  572. #else
  573. #error    SCSI command / data structures are compiler sensitive
  574. #endif
  575. } mode_sel_bd_t;
  576.  
  577. #define MODSEL_DATA_LEN    0x30
  578.  
  579. typedef struct mode_sel_data {
  580.  
  581.     /* transferred to/from target during mode select/mode sense */
  582.     struct mode_sel_hdr msd_header;
  583.     struct mode_sel_bd  msd_blockdescript;
  584.     u_char msd_vudata[MODSEL_DATA_LEN];    /* for vendor unique data */
  585. } mode_sel_data_t;
  586.  
  587. /* 
  588.  * struct for MTIOCMODSEL/ MTIOCMODSEN
  589.  */
  590. typedef struct modesel_parms {
  591.     struct mode_sel_data    msp_data;
  592.     int            msp_bcount;    /* # of bytes to DMA */
  593. } modesel_parms_t;
  594.  
  595. /*
  596.  * Day-to-day constants in the SCSI world
  597.  */
  598. #define    SCSI_NTARGETS    8        /* 0 - 7 for target numbers */
  599. #define    SCSI_NLUNS    8        /* 0 - 7 luns for each target */
  600.  
  601. /*
  602.  * Defect list header
  603.  * Used by FORMAT and REASSIGN BLOCK commands
  604.  */
  605. struct defect_header {
  606.  
  607. #if    __BIG_ENDIAN__
  608.  
  609.     u_char    dh_mbz1;
  610.     u_char    dh_fov:1,        /* format options valid */
  611.         dh_dpry:1,        /* disable primary */
  612.         dh_dcrt:1,        /* disable certification */
  613.         dh_stpf:1,        /* stop format */
  614.         dh_mbz2:4;
  615.     u_short    dh_len;            /* items in defect list */
  616.  
  617. #elif    __LITTLE_ENDIAN__
  618.  
  619.     u_char    dh_mbz1;
  620.     u_char    dh_mbz2        :4,
  621.         dh_stpf        :1,
  622.         dh_dcrt        :1,
  623.         dh_dpry        :1,
  624.         dh_fov        :1;
  625.     u_char    dh_len1;
  626.     u_char    dh_len0;
  627.  
  628. #else
  629. #error    SCSI command / data structures are compiler sensitive
  630. #endif
  631. };
  632.  
  633. /*
  634.  * Status for scsi_req (see below).
  635.  */
  636. typedef enum {
  637.     
  638.     SR_IOST_GOOD    = 0,        /* successful */
  639.     SR_IOST_SELTO    = 1,        /* selection timeout */
  640.     SR_IOST_CHKSV    = 2,        /* check status, sr_esense */
  641.                     /*    valid */
  642.     SR_IOST_CHKSNV    = 3,        /* check status, sr_esense */
  643.                     /*    not valid */
  644.     SR_IOST_DMAOR    = 4,        /* target attempted to move */
  645.                     /*    more than sr_dma_max */
  646.                     /*    bytes */
  647.     SR_IOST_IOTO    = 5,        /* sr_ioto exceeded */
  648.     SR_IOST_BV    = 6,        /* SCSI Bus violation */
  649.     SR_IOST_CMDREJ    = 7,        /* command reject (by 
  650.                      *    driver) */
  651.     SR_IOST_MEMALL    = 8,        /* memory allocation failure */
  652.     SR_IOST_MEMF    = 9,        /* memory fault */
  653.     SR_IOST_PERM    = 10,        /* not super user */
  654.     SR_IOST_NOPEN    = 11,        /* device not open */
  655.     SR_IOST_TABT    = 12,        /* target aborted command */
  656.     ST_IOST_BADST    = 13,        /* bad SCSI status byte  */
  657.                     /*  (other than check status)*/
  658. #define    SR_IOST_BADST    ST_IOST_BADST
  659.     ST_IOST_INT    = 14,        /* internal driver error */
  660. #define    SR_IOST_INT    ST_IOST_INT
  661.     SR_IOST_BCOUNT    = 15,        /* unexpected byte count */
  662.                     /* seen on SCSI bus */ 
  663.     SR_IOST_VOLNA    = 16,        /* desired volume not available */
  664.     SR_IOST_WP    = 17,        /* Media Write Protected */
  665.     SR_IOST_ALIGN    = 18,        /* DMA alignment error */
  666.     SR_IOST_IPCFAIL = 19,        /* Mach IPC failure */
  667.     SR_IOST_RESET    = 20,        /* bus was reset during 
  668.                      * processing of command */
  669.     SR_IOST_PARITY    = 21,        /* SCSI Bus Parity Error */
  670.     SR_IOST_HW    = 22,        /* Gross Hardware Failure */
  671.     SR_IOST_DMA    = 23,        /* DMA error */
  672.     SR_IOST_INVALID    = 100,        /* should never be seen */
  673. } sc_status_t;
  674.  
  675. /*
  676.  * DMA Direction.
  677.  */
  678. typedef enum {
  679.     SR_DMA_RD = 0,            /* DMA from device to host */
  680.     SR_DMA_WR = 1,            /* DMA from host to device */
  681. } sc_dma_dir_t;
  682.  
  683. /*
  684.  * SCSI Request used by sg driver via SGIOCREQ and internally in st driver
  685.  */
  686.  
  687. typedef struct scsi_req {
  688.  
  689.     /*** inputs ***/
  690.     
  691.     cdb_t            sr_cdb;        /* command descriptor block - 
  692.                          * one of three formats */
  693.     sc_dma_dir_t        sr_dma_dir;    /* DMA direction */
  694.     caddr_t            sr_addr;    /* memory addr for data 
  695.                          * transfers */
  696.     int            sr_dma_max;    /* maximum number of bytes to
  697.                          * transfer */
  698.     int            sr_ioto;    /* I/O timeout in seconds */
  699.                          
  700.     /*** outputs ***/
  701.     
  702.     int            sr_io_status;    /* driver status */
  703.     u_char            sr_scsi_status;    /* SCSI status byte */
  704.     esense_reply_t         sr_esense;    /* extended sense in case of
  705.                          * check status */
  706.     int            sr_dma_xfr;    /* actual number of bytes 
  707.                          * transferred by DMA */
  708.     struct    timeval        sr_exec_time;    /* execution time in 
  709.                          * microseconds */
  710.     /*** for driver's internal use ***/
  711.     
  712.     u_char            sr_flags;
  713.     queue_chain_t        sr_io_q;    /* for linking onto sgdp->
  714.                          *    sdg_io_q */
  715. } scsi_req_t;
  716.  
  717. typedef struct scsi_adr {
  718.  
  719.     u_char            sa_target;
  720.     u_char            sa_lun;
  721.     
  722. } scsi_adr_t;
  723.  
  724.  
  725. /*
  726.  *    Generic SCSI ioctl requests
  727.  */
  728.  
  729. #define SGIOCSTL    _IOW ('s', 0, struct scsi_adr)    /* set target/lun */
  730. #define    SGIOCREQ    _IOWR('s', 1, struct scsi_req)     /* cmd request */
  731. #define SGIOCENAS    _IO(  's', 2)             /* enable autosense */
  732. #define SGIOCDAS    _IO(  's', 3)            /* disable autosense */
  733. #define SGIOCRST    _IO(  's', 4)            /* reset SCSI bus */
  734. #define SGIOCCNTR       _IOW( 's', 6, int)              /* select controller */
  735.  
  736. /*
  737.  *    ioctl requests specific to SCSI disks
  738.  */
  739. #define    SDIOCSRQ    _IOWR('s', 1, struct scsi_req)     /* cmd request using */
  740.                             /* struct scsi_req */
  741.  
  742. #define SDIOCGETCAP    _IOR  ('s', 5, struct capacity_reply)
  743.                             /* Get Read 
  744.                              * Capacity info */
  745.  
  746. /* 
  747.  *    ioctl requests specific to SCSI tapes 
  748.  */
  749.  
  750. #define    MTIOCFIXBLK    _IOW('m', 5, int )    /* set fixed block mode */
  751. #define MTIOCVARBLK     _IO('m',  6)        /* set variable block mode */
  752. #define MTIOCMODSEL    _IOW('m', 7, struct modesel_parms)    
  753.                         /* mode select */
  754. #define MTIOCMODSEN    _IOWR('m',8, struct modesel_parms)    
  755.                         /* mode sense */
  756. #define MTIOCINILL    _IO('m',  9)        /* inhibit illegal length */
  757.                         /*    errors */
  758. #define MTIOCALILL    _IO('m',  10)        /* allow illegal length */
  759.                         /*    errors */
  760. #define    MTIOCSRQ    _IOWR('m', 11, struct scsi_req)     
  761.                         /* cmd request using 
  762.                          * struct scsi_req */
  763.  
  764.  
  765. /*
  766.  *    constants used in scsi_req
  767.  */
  768.  
  769.      /*** sr_dma_dir ***/
  770.     
  771.  
  772. #endif _BSD_DEV_SCSIREG_
  773.  
  774.